package com.example.springboot.RabbitMQ.Config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.transaction.RabbitTransactionManager;
import org.springframework.beans.CachedIntrospectionResults;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;


@Configuration
@Slf4j
public class RabbitConfig implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnsCallback {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 将两个回调函数加载到RabbitTemplate中
     * @PostConstruct 此注解修饰的方法会在对象创建后被立即执行
     */
    @PostConstruct
    public void initRabbitTemplate() {
        rabbitTemplate.setConfirmCallback(this);
        rabbitTemplate.setReturnsCallback(this);
    }

    /**
     * 发送消息回调函数
     * 消息发送到交换机成功或失败后会调用这个函数
     * 发送消息到
     * @param correlationData
     * @param ack
     * @param cause
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        log.info("confirm()回调函数打印 correlationData ： " + correlationData);
        log.info("confirm()回调函数打印 ack ： " + ack);
        log.info("confirm()回调函数打印 cause ： " + cause);
        System.out.println("confirm()回调函数打印 correlationData ： " + correlationData);
        System.out.println("confirm()回调函数打印 ack ： " + ack);
        System.out.println("confirm()回调函数打印 cause ： " + cause);

    }

    /**
     * 发送消息失败回调函数
     * 当消息发送到队列失败时，回调此函数
     * @param returnedMessage
     */
    @Override
    public void returnedMessage(ReturnedMessage returnedMessage) {
        log.info("returnedMessage()回调函数打印 returnedMessage ： " + returnedMessage);
        System.out.println("returnedMessage()回调函数打印 returnedMessage ： " + returnedMessage);
    }

}
